#数据分析
import numpy as np
import numpy as py
import pandas as pd
import re
df=pd.read_excel('最新发布的北京二手房数据.xlsx')
pd.set_option('display.unicode.east_asian_width',True)
def dealYear(year):
    num=year
    if type(year)==str:
        num=2022-int(year)
    return num
def dealType(ser):
    data=np.zeros((len(ser),),dtype='int')
    df=pd.DataFrame({'室':data,'厅':data})
    for i in ser.index:
        if ser[i]!='车位':
            rec=re.findall(r'\d+',ser[i])
            df.loc[i,'室']=int(rec[0])
            df.loc[i,'厅']=int(rec[1])
    return df
df['户型'] = df['户型'].str.replace('房间', '室')
df = df.join(dealType(df['户型']))
df['年份'] = df['年份'].str.replace('年建', '').apply(lambda x: dealYear(x))
df['面积'] = df['面积'].str.replace('平米', '').astype('float')
df['总价'] = df['总价'].str.replace('万', '').astype('float')
df['单价'] = df['单价'].str.replace(',', '').str.replace('元/平','').astype('float')
df=df.rename({'面积':'面积（平方米）','年份':'房龄','总价':'总价（万元）','单价':'单价（元/平方米）'},axis='columns')
print(df[['面积（平方米）','房龄','总价（万元）','单价（元/平方米）','室','厅']])

#异常值处理
df1=df[df['户型']=='车位']
print('包含车位的行:\n',df1)
print('删除户型异常值前的行数：',len(df))
df=df.drop(df1.index)
print('删除户型异常值后的行数：',len(df))

df2=df['房龄'][(df['房龄']<0)|(df['房龄']>50)]
print('房龄小于0或大于50的行:\n',df2)
print('删除房龄异常值前数据的行数:\n',len(df))
df=df.drop(df2.index)
print('删除房龄异常值后的数据的行数:',len(df))

#重复值处理
df3=df.duplicated(keep=False)
print('所有列重复的行：\n',df[df3==True])
print('删除重复值前数据的行数',len(df))
df=df.drop_duplicates()
print('删除重复值后数据的行数:',len(df))

#缺失值处理
print('删除房龄缺失值前的数据：',len(df))
df=df.dropna(subset='房龄')
print('删除房龄缺失值后的数据：',len(df))
df=df.fillna({'房源标签','不近地铁'})
print('房源标签替换缺失值后的数据:\n',df.iloc[:,-10:])

#连续数据离散化
bins=[1,60,90,120,150,180,210,520]
area_label=['60平米以下','60~90平方米','90~120平方米','120~150平方米','150~180平方米','180~210平方米','210平方米以上']
df['面积区间']=pd.cut(list(df['面积（平方米）']),bins,labels=area_label)
bins=[1,200,400,600,800,1000,2000,4500]
totalPrice_label=['200万元以下','200-400万元','400-600万元','600-800万元','800-1000万元','1000-2000万元','2000万元以上']
df['总价区间']=pd.cut(list(df['总价（万元）']),bins,labels=totalPrice_label)
print(df.iloc[:,-5:])





